package com.kun.video.thread;

import com.kun.video.exception.BizException;

import java.util.concurrent.FutureTask;

/**
 * 带优先级的FutureTask实现
 * <p>
 * 包装PrioritizedTask以实现任务队列的优先级排序功能
 * 通过实现Comparable接口确保优先级队列正确排序
 * </p>
 *
 * @author gzc
 * @since 2025/2/3
 **/
public class PriorityFutureTask<T> extends FutureTask<T>
        implements Comparable<PriorityFutureTask<T>> {

    /**
     * 封装的优先级任务对象
     */
    private final PrioritizedTask prioritizedTask;

    //------------------------- 构造函数 -------------------------

    /**
     * 全参数构造函数
     *
     * @param runnable 必须为PrioritizedTask类型的任务
     * @param result   任务执行结果（可为null）
     * @throws BizException 如果runnable类型不匹配
     */
    public PriorityFutureTask(Runnable runnable, T result) {
        super(runnable, result);
        if (!(runnable instanceof PrioritizedTask)) {
            throw new BizException("非法任务类型: " + runnable.getClass().getName() +
                    "，必须为PrioritizedTask");
        }
        this.prioritizedTask = (PrioritizedTask) runnable;
    }

    //------------------------- 核心方法 -------------------------

    /**
     * 获取封装的优先级任务对象
     */
    public PrioritizedTask getPrioritizedTask() {
        return prioritizedTask;
    }

    //------------------------- 比较逻辑 -------------------------

    /**
     * 比较方法实现（委托给PrioritizedTask）
     *
     * @param other 对比任务对象
     * @return 比较结果（倒序排列）
     */
    @Override
    public int compareTo(PriorityFutureTask<T> other) {
        return this.prioritizedTask.compareTo(other.prioritizedTask);
    }
}